package com.woniu.order.service.impl;

import com.woniu.order.common.enums.CartEnum;
import com.woniu.order.infra.model.Cart;
import com.woniu.order.infra.mapper.CartMapper;
import com.woniu.order.service.CartService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.order.service.dto.CartItemDto;
import com.woniu.order.service.param.AddCartServiceParam;
import com.woniu.order.service.param.DelCartServiceParam;
import com.woniu.order.service.param.ModifyCartServiceParam;
import com.woniu.product.client.ProductQueryClient;
import com.woniu.product.client.result.ProductItemResultInfo;
import com.woniu.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 购物车表 服务实现类
 * </p>
 *
 * @author Lucas
 * @since 2022-11-26
 */
@Service
@Slf4j
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements CartService {
@Resource
private RedissonClient redissonClient;

@Resource
private ProductQueryClient productQueryClient;

    /**
     *查询本人的购物车
     * @param userId
     * @return
     */
    @Override
    public List<CartItemDto> searchCarts(Integer userId) {
        RBucket<Map<Integer, CartItemDto>> bucket = redissonClient.getBucket(CartEnum.USER_CAT.getCode() + userId);
        if (!bucket.isExists()) {
            return new ArrayList<>();
        }
        Map<Integer, CartItemDto> itemMap = bucket.get();
        List<CartItemDto> CartItemDtos = itemMap.entrySet().stream().map(entry -> entry.getValue()).collect(Collectors.toList());
        return CartItemDtos;
    }

    /**
     * 添加进购物车
     * @param addCartServiceParam
     */
    @Override
    public void addCart(AddCartServiceParam addCartServiceParam) {
        //通用对象桶
        RBucket<Map<Integer, CartItemDto>> bucket = redissonClient.getBucket(CartEnum.USER_CAT.getCode() + addCartServiceParam.getUserId());
        //添加到redis
        Map<Integer, CartItemDto> itemMap = null;
        CartItemDto cartItemDto = null;
        if (bucket.isExists()) {
            itemMap = bucket.get();
        } else {
            //第一次添加
            itemMap = new HashMap<>();
        }
        cartItemDto = itemMap.get(addCartServiceParam.getSkuId());
        if (cartItemDto != null) {
            //已存在，加数量
            cartItemDto.setCount(cartItemDto.getCount() + addCartServiceParam.getCount());
        } else {
            //不存在，就新建
            cartItemDto = new CartItemDto();
            cartItemDto.setSkuId(addCartServiceParam.getSkuId());
            cartItemDto.setCount(addCartServiceParam.getCount());
            //查询商品信息
            Result<ProductItemResultInfo> productInfo = productQueryClient.getProductInfoBySkuId(addCartServiceParam.getSkuId());
            ProductItemResultInfo data = productInfo.getData();
            cartItemDto.setPrice(data.getPrice());
            cartItemDto.setSpuName(data.getSpuName());
            cartItemDto.setSpuMainPic(data.getSpuMainPic());
            cartItemDto.setPropValues(data.getPropValues());
        }
        itemMap.put(addCartServiceParam.getSkuId(), cartItemDto);
        bucket.set(itemMap);
        log.debug("当前购物车信息:{}", bucket.get());
    }

    /**
     * 删除购物车相关商品
     * @param delCartServiceParam
     */
    @Override
    public void delCart(DelCartServiceParam delCartServiceParam) {
        List<CartItemDto> cartItemDtos = searchCarts(delCartServiceParam.getUserId());
        cartItemDtos.removeIf(s -> s.getSkuId().equals(delCartServiceParam.getSkuId()));
        put(cartItemDtos, delCartServiceParam.getUserId());
    }

    /**
     * 修改购物车商品
     * @param modifyCartServiceParam
     */
    @Override
    public void modifyCart(ModifyCartServiceParam modifyCartServiceParam) {
        List<CartItemDto> cartItemDtos = searchCarts(modifyCartServiceParam.getUserId());
        for (CartItemDto c : cartItemDtos) {
            if (c.getSkuId().equals(modifyCartServiceParam.getSkuId())) {
                c.setCount(modifyCartServiceParam.getCount());
            }
        }
        put(cartItemDtos, modifyCartServiceParam.getUserId());
    }

    /**
     * 存入对象桶
     * @param list
     * @param userId
     */
    public void put(List<CartItemDto> list, int userId) {
        Map<Integer, CartItemDto> itemMap = new HashMap<>();
        for (CartItemDto l : list) {
            itemMap.put(l.getSkuId(), l);
        }
        RBucket<Map<Integer, CartItemDto>> bucket = redissonClient.getBucket(CartEnum.USER_CAT.getCode() + userId);
        bucket.set(itemMap);
    }
}
